$.extend(Array.prototype, {
    /**
     * 名称：indexOf        属于:Array
     * 描述：返回指定项首次出现的索引，未找到返回-1
     * @param obj
     * @return
     * */
    __indexOf: (function () {
        var isPlainObject = $.isPlainObject || function (obj) {
                if (typeof obj !== "object" || obj.nodeType || obj === obj.window) {
                    return false;
                }
                if (obj.constructor && !hasOwn.call(obj.constructor.prototype, "isPrototypeOf")) {
                    return false;
                }
                return true;
            };
        return function (obj) {
            if (this.length == 0 || arguments.length == 0) {
                return -1;
            } else if (isPlainObject(this[0]) && Object.prototype.toString.call(obj) === '[object String]' && arguments.length == 2) {
                var key = obj;
                var val = arguments[1];
                var index = this.__each(function (i) {
                    if (this[key] == val) {
                        return i;
                    }
                });
                return index == null ? -1 : index;
            } else if (typeof obj === "function") {
                var _index = this.__each(obj, function (index, array, funRet) {
                    if (funRet) {
                        return index;
                    }
                });
                return _index == null ? -1 : _index;
            } else if (Object.prototype.toString.call(obj) === '[object String]' || /^[]{0,1}[0-9]{0,}[.]{0,1}[0-9]{0,}$/.test(obj)) {
                var re = new RegExp("," + obj + ",", [""]);
                return ','.concat(this.toString()).concat(',').replace(re, "┢").replace(/[^,┢]/g, "").indexOf("┢");
            } else {
                var flag = -1;
                jQuery.each(this, function (index) {
                    if (isPlainObject(this)) {
                        if (flag < 0 && Fantasy.encode(this).equals(Fantasy.encode(obj))) {
                            flag = index;
                        }
                    } else {
                        if (flag < 0 && this == obj) {
                            flag = index;
                        }
                    }
                });
                return flag;
            }
        };
    })(),


    /**
     * 名称：remove        属于:Array
     * 描述：从数组中移除对象
     * @param obj
     * @return
     */
    __remove: function (obj) {
        if (this.length == 0 || arguments.length == 0) {
            return false;
        }
        var index = !isNaN(obj) ? obj : this.indexOf.apply(this, arguments);
        if (index > -1) {
            this.splice(index, 1);
            return true;
        }
        return false;
    },

    /**
     * 清空数组
     */
    __clear: function () {
        this.length = 0;
    },

    /**
     * 向数组中插入元素
     * @param index 要插入的位置
     * @param value    要插入的元素
     */
    __insert: function (index, value) {
        if (index == null || value == null) {
            throw new Error('index 和 value,参数都必须不能为空!');
        }
        if (index > this.length) {
            index = this.length;
        }
        if (index == this.length) {
            this.push(value);
            return this;
        }
        else {
            var part1 = this.slice(0, index);
            var part2 = this.slice(index);
            part1.push(value);
            this.clear();
            this.pushAll((part1.concat(part2)));
            return this;
        }
    },
    /**
     * 向数组中添加另一个数组
     * @param arry 要添加的数组
     */
    pushAll: function (arry) {
        if (typeof arry == "undefined" || arry == null) {
            return;
        }
        if (Object.prototype.toString.call(arry) === '[object Array]') {
            var zthis = this;
            arry.__each(function () {
                zthis.push(this);
            });
        }
        else {
            this.push(arry);
        }
    },
    /**
     * 在数组中的每个项上运行一个函数
     * @param {Object} fun    如果fun函数有返回值的,fil函数为null,each方法返回该值
     * @param {Object} fil    如果fun函数有返回值的,fil函数将会触发,如果fil 也有返回值,该值为each方法的返回值.
     */
    __each: function (fun, fil) {
        for (var i = 0, length = this.length; i < length; i++) {
            var retVal = fun.call(this[i], i, this[i], this);
            if (!fil) {
                if (!(typeof retVal == "undefined" || retVal == null)) {
                    return retVal;
                }
            } else {
                retVal = fil.call(this[i], i, this, retVal);
                if (!(typeof retVal == "undefined" || retVal == null)) {
                    return retVal;
                }
            }
        }
    }
});